#include "ThreadCache.hpp"

#include<algorithm>
void* ThreadCache::FetchFromCentralCache(size_t index,size_t size)
{
    //慢启动，一开始只给较少的内存
    //大对象给多一些内存，小对象给少一点
    //如果是8字节的话，那么centralcache就一下子给500+对象，这样也不太好.
    //下面由于_maxSize 设置成1，那一开始就取的是1个对象
    //如果你不断有szie大小内存需求，那么batchNum就会不断增长，直达上限
    //3.size越大，一次向centralcache要的batchNum就越小
    //4.size越小，一次向centralcache要的batchNum就越大
    size_t batchNum=std::min(_freeLists[index].MaxSize(),SizeClass::NumMoveSize(size));
    
    if(_freeLists[index].MaxSize()==batchNum)
    {
        _freeLists[index].MaxSize()+=1;//
    }

}
void*ThreadCache::Allocate(size_t size)
{
    assert(size<=MAX_BYTES);
    //对齐大小
    size_t alignSize = SizeClass::RoundUp(size);
    //处于哪一个桶？
    size_t index = SizeClass::Index(size);
    if(!_freeLists[index].Empty())
    {
        return _freeLists[index].Pop();
    }
    else
    { 
        return FetchFromCentralCache(index,alignSize);
    }

}
void ThreadCache::Dellocate(void* ptr,size_t size)
{
    assert(size<=MAX_BYTES&&ptr);
    //找对映射的自由链表桶，插入进去
    size_t index = SizeClass::Index(size);//几号桶？
    _freeLists[index].Push(ptr);//插入
}
 